Skip to main content

43.4.4 TestRestTemplate

43.4.4 TestRestTemplate

Spring Framework 5.0提供了一个新的WebTestClient。它服务于WebFlux集成测试WebFlux与MVC端到端测试。不像TestRestTemplate,它为断言提供了流畅的API。

在集成测试中,TestRestTemplate是Spring RestTemplate的便利替代。你可以获取一个普通的或发送基本HTTP认证(使用用户名和密码)的模板。不管哪种情况,这些模板都对测试友好,对于服务端错误不会抛出异常。推荐使用Apache HTTP Client(4.3.2或更高版本),但不强制这样做。如果相关库在classpath下存在,TestRestTemplate将以正确配置的client进行响应。如果你使用Apache的HTTP客户端,一些额外的测试友好的特性将会被启用:

  • 重定向不会被跟踪(所以你可以断言回应的位置)
  • Cookies将会被忽略(所以模版是无状态的)

TestRestTemplate能够在你的集成测试中被直接实例化:

public class MyTest {

private TestRestTemplate template = new TestRestTemplate();

@Test
public void testRequest() throws Exception {
HttpHeaders headers = this.template.getForEntity(
"http://myhost.example.com/example", String.class).getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}

}

或者,如果你正在使用@SpringBootTest,且设置了WebEnvironment.RANDOM_PORTWebEnvironment.DEFINED_PORT属性,你可以注入一个配置完全的TestRestTemplate,并开始使用它。如果有需要,你还可以通过RestTemplateBuilder bean进行额外的自定义。任何没有指定主机和端口的URL将会自动连接到内嵌的服务器:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class SampleWebClientTests {

@Autowired
private TestRestTemplate template;

@Test
public void testRequest() {
HttpHeaders headers = this.template.getForEntity("/example", String.class)
.getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}

@TestConfiguration
static class Config {

@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder().setConnectTimeout(1000).setReadTimeout(1000);
}

}

}